系列:「一人艦隊:用一群 AI CLI 打造跨平台代理 mesh」— 第 17 篇,不設天數
紀錄日期:2026-09-15
這個系列從 9/9 的 Day 16 之後停了五天。原因很單純:那幾天在趕一個跨機 demo,每天做到很晚,文章排在最後一件事,最後一件事就掉了。鐵人賽的 30 天連續挑戰在這裡算失敗,我不打算找理由。
但這個系列不會停。開賽時我就寫過「會一直寫到我的專案真的每天在服務我為止」,這句話還算數。之後每天照樣記錄,直到專案完成;賽制上算不算完賽,不影響我寫。今天同時另開了一個新系列(Day 01|先畫地圖再上路),那邊寫「AI 工程師的能力」,這邊繼續寫專案本身,兩邊互相引用,不重複。
這篇把中斷期間的紀錄補回來。材料全部來自 git log 和各台機器的報告,數字是真的,沒做到的也照寫。
先誠實:這兩天 repo 上一個 commit 都沒有。不是在做別的功能,是真的沒碰。
四個 commit,全部是文件,沒有程式:
這一天決定了接下來三天的方向。Day 13 我寫過「手機也是工作節點」,當時只是目標;9/12 把它變成了一份有欄位、有雜湊、有失敗碼的 API 契約(MONDAY-MESH-API):roster 怎麼簽章、fan-out 的 body 長什麼樣、participants 要排序後做 sha256、停止指令送出後畫面只能顯示「停止中」,要等到終止事件才准寫「已停止」。這份契約後來成了每一台機器、每一個 AI CLI 對齊的唯一依據。
這台 M5 是 9/13 才加入艦隊的節點,代號 m5。當天的紀錄:
上午:盤點。 五個 AI CLI 的版本與狀態:Codex 0.154.0(配額用完,要到 9/19 才恢復)、Claude Code 2.1.261、OpenCode 1.18.30、AGY 1.2.2、Copilot 沒裝。這份清單寫進報告,因為後面派工要知道哪台的哪個 CLI 能用。
中午:先寫 fixture,再寫畫面。 手機端的 Mesh 畫面和 App-local executor 完全對著契約寫。不先開 App,先用契約裡的 roster 和 events 範例當測試資料,把 participants 排序、confirmation 雜湊、事件游標做到和 core 的 Rust 端一模一樣。這裡抓到兩個如果直接寫畫面絕對不會發現的 bug:
下午:手機不能跑 CLI,那它跑什麼。 契約第 6 節給的答案是 App-local executor:手機拿自己的 API key(BYOK),推論在雲端 provider,手機只負責 pull 任務、報告結果、附上 nonce 回顯和 output 的 sha256。手機在畫面上明確標示「remote inference via groq」,不准寫成「在 iPhone 上本機執行」。
晚上:真機。 iOS 和 iPad 各裝一版,過程中踩到的坑,每一個都花了時間:
當天最後一版 IPA 裝上 iPhone 和 iPad,兩台都能 pull、能報告,receipt 驗證通過。另外把 App icon 改成和桌面版同一張圖,介面砍到只剩 Mesh 和設定兩個分頁:demo 只需要這兩個,其他都是干擾。
同一天還補了契約 §3.1 的「規劃式 fan-out」:coordinator 先把 prompt 拆成每台一份子任務,再派下去。真機上跑出六份不同的子任務,receipt 全部驗證過。
接入。 這台 Mac 加進由 Z13 當 coordinator 的 mesh:驗證 cluster secret 的 SHA-256 前綴、備份設定、只改 peers 和 secret、重啟 daemon、用簽章請求打 Z13 的 /rpc/mesh/self 確認身分。過程中出了一次錯:我用 sed 做遮罩時,工具輸出把新舊密鑰都印了出來。這個違反了「全程不印密鑰」的規則,當場承認,建議輪換。之後遮罩改用 awk,不再出事。
Fleet fan-out。 從 Z13 發起,8 個參與者全部完成,含真機 iPhone 和 iPad,跑了兩次都是 8/8。手機畫面的預設勾選改成「coordinator 凍結的參與者集合」,因為契約要求 fan-out 的 participants 必須和凍結的 manifest 逐 byte 相符,勾錯一個就會被拒。
從手機畫面發起。 12 個參與者跑完 13 個 attempt,其中 ipad-pro 拿到一個 Groq 429:四支手機共用一把 key,免費層每分鐘 1000 output token 的上限一下就撞到。畫面上紅字誠實顯示 429,沒有藏。應對是 maxTokens 從 512 降到 256,之後每支手機要用自己的 key。
完整回答。 到這裡,手機能「一個 prompt → 每台各自輸出」,但沒有「合成一份回答」。當天補上:task 結束後,發起端手機用自己的 BYOK 模型把所有參與者的輸出合併成一份,顯示在畫面最上方,標示「本機彙整,非 receipt」。實測 task 2bb27031:12 個參與者全部完成,合併出一份三段式的回答。

(iPad 畫面:合併後的完整回答)

(iPad 畫面:每台機器各自的子任務、pid 與輸出)
兩件沒做到的事,照寫。
| 項目 | 數字 |
|---|---|
| 分支上的 commit(所有節點,9/12 起) | 128 |
| 其中這台 M5 的 commit | 35 |
| 艦隊節點 | 9 台(6 桌機、3 手機) |
| 從手機畫面發起、全部完成的 fleet task | 12/12 |
| 真機 iPhone + iPad 參與且 receipt 驗證通過的 fleet run | 2 次,各 8/8 |
| 誠實記錄的失敗 | Groq 429 一次、密鑰誤印一次、manifest 隨重啟消失一次 |
明天照常。